"""
Flask应用初始化模块
负责创建和配置Flask应用实例，包括数据库、登录管理、CSRF保护等核心功能的初始化
"""

from flask import Flask
from flask_wtf.csrf import CSRFProtect
from .config import Config
from .models.database import db, login_manager
from .models.models import Teacher, Student

def create_app():
    """
    创建并配置Flask应用实例
    
    Returns:
        Flask: 配置完成的Flask应用实例
    """
    # 创建Flask应用实例，指定静态文件目录
    app = Flask(__name__, static_folder='static')
    
    # 从Config类加载应用配置
    app.config.from_object(Config)
    
    # 检查数据库配置是否存在
    if not app.config.get('SQLALCHEMY_DATABASE_URI'):
        raise RuntimeError('SQLALCHEMY_DATABASE_URI is not set in the configuration')

    # 初始化CSRF保护，防止跨站请求伪造攻击
    csrf = CSRFProtect()
    csrf.init_app(app)

    # 初始化SQLAlchemy数据库
    db.init_app(app)
    with app.app_context():
        # 创建所有数据库表（如果不存在）
        db.create_all()

    # 配置Flask-Login登录管理器
    login_manager.init_app(app)
    login_manager.login_view = 'auth.login'  # 设置登录页面的端点
    login_manager.login_message = '请先登录'  # 设置未登录时的提示消息
    login_manager.login_message_category = 'info'  # 设置消息类型

    # 将Python内置的zip函数添加到Jinja2模板环境中，方便在模板中使用
    app.jinja_env.globals.update(zip=zip)

    # 注册所有蓝图（Blueprint）
    from .routes import auth, student  # 学生端路由
    from .routes import tea_auth, tea_class, tea_course, tea_student, tea_grade, tea_analysis, tea_profile  # 教师端路由
    
    # 注册学生端蓝图
    app.register_blueprint(auth.bp)  # 认证相关路由
    app.register_blueprint(student.bp)  # 学生功能路由
    
    # 注册教师端蓝图
    app.register_blueprint(tea_auth.bp)  # 教师认证路由
    app.register_blueprint(tea_class.bp)  # 班级管理路由
    app.register_blueprint(tea_course.bp)  # 课程管理路由
    app.register_blueprint(tea_student.bp)  # 学生管理路由
    app.register_blueprint(tea_grade.bp)  # 成绩管理路由
    app.register_blueprint(tea_analysis.bp)  # 成绩分析路由
    app.register_blueprint(tea_profile.bp)  # 教师个人信息路由

    # 为所有API路由豁免CSRF保护，因为API通常使用其他认证方式
    for rule in app.url_map.iter_rules():
        if '/api/' in str(rule):
            csrf.exempt(app.view_functions[rule.endpoint])

    return app 